import axios from 'axios'
// 我们不使用环境变量中的baseUrl，而是让请求通过Vite代理
const baseUrl = process.env.VUE_APP_API_URL;

// 不再在顶层获取uid，改为在请求时动态获取
// let uid = localStorage.getItem('uid');

// 创建axios实例
const service = axios.create({
  // 不设置baseURL，使用相对路径，这样请求会通过本地Vite代理
  baseURL: baseUrl,
  timeout: 30000, // 增加超时时间到30秒
  // withCredentials: false, // 修改为false，因为服务器使用'*'作为Access-Control-Allow-Origin
  // 初始headers可以为空，在请求拦截器中动态添加
  headers: {
    // uid会在请求拦截器中设置
  },
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在每次请求时动态获取最新的uid
    // 优先从URL参数中获取uid，如果URL中没有，再从localStorage中获取
    let uid;
    try {
      // 从哈希片段中获取uid
      const hash = window.location.hash;
      // 找出哈希中问号的位置
      const queryIndex = hash.indexOf('?');
      let urlUid = null;

      if (queryIndex !== -1) {
        // 提取问号及之后的部分
        const queryString = hash.substr(queryIndex);
        const urlParams = new URLSearchParams(queryString);
        urlUid = urlParams.get('uid');
      } else {
        // 尝试从常规查询参数中获取-history
        const urlParams = new URLSearchParams(window.location.search);
        urlUid = urlParams.get('uid');
      }
      // 优先使用URL中的uid，其次使用localStorage中的uid
      uid = urlUid;
      // 从localStorage获取uid
      const localUid = localStorage.getItem('uid');
      if (urlUid && urlUid !== localUid) {
        localStorage.setItem('uid', urlUid);
      }
    } catch (error) {
      uid = localStorage.getItem('uid');
    }

    if (uid) {
      config.headers['uid'] = uid;
    } else {
      console.warn('No uid found, request may fail');
    }

    // 例如：可以添加token
    const token = localStorage.getItem('token')
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  error => {
    // 处理请求错误

    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    // console.log('收到响应:', res);

    // 处理不同的响应格式
    // 有些API可能不返回code字段，或者使用不同的成功状态码
    if (res.code !== undefined && res.code !== 200) {
      // 可以在这里处理各种错误状态
      // console.error('API调用出错:', res.message || '未知错误')
      return Promise.reject(new Error(res.message || 'unknown error'))
    } else {
      return res
    }
  },
  error => {
    // 处理http请求错误
    // console.error('请求出错详情:', error.message, error.config?.url);

    // 输出更详细的错误信息
    if (error.response) {
      // 服务器返回了错误状态码
      console.error('service:', {
        status: error.response.status,
        headers: error.response.headers,
        data: error.response.data
      });
    } else if (error.request) {
      // 请求已发送但没有收到响应
      // console.error('未收到响应，请求详情:', error.request);
    }

    return Promise.reject(error)
  }
)

// 导出一个刷新函数，用于在应用中主动更新uid (可选)
export function refreshUid () {
  // 这个函数可以在需要时调用，但实际上不需要做任何事情
  // 因为我们每次请求时都会重新获取uid
  // 保留这个函数是为了提供API一致性
  // console.log('uid已刷新为:', localStorage.getItem('uid'));
}

// 封装GET请求
export function get (url, params) {
  return service({
    url,
    method: 'get',
    params
  })
}

// 封装POST请求
export function post (url, data) {
  return service({
    url,
    method: 'post',
    data
  })
}

// 封装PUT请求
export function put (url, data) {
  return service({
    url,
    method: 'put',
    data
  })
}

// 封装DELETE请求
export function del (url, params) {
  return service({
    url,
    method: 'delete',
    params
  })
}

export default service